home *** CD-ROM | disk | FTP | other *** search
/ Chip 2007 January, February, March & April / Chip-Cover-CD-2007-02.iso / Pakiet bezpieczenstwa / mini Pentoo LiveCD 2006.1 / mpentoo-2006.1.iso / livecd.squashfs / opt / pentoo / ExploitTree / system / solaris / local / time.c < prev    next >
C/C++ Source or Header  |  2005-02-12  |  5KB  |  221 lines

  1. /*
  2.  *
  3.  * Here's a similar snippet for Solaris
  4.  * using the procfs interface...
  5.  *
  6.  * Daniel Brown, dbrown@ccdc.cam.ac.uk
  7.  *
  8.  */
  9.  
  10. #include <sys/types.h>
  11. #include <sys/stat.h>
  12. #include <sys/param.h>
  13. #include <sys/syscall.h>
  14. #include <sys/uio.h>
  15.  
  16. #include <fcntl.h>
  17. #include <procfs.h>
  18. #include <stdio.h>
  19. #include <unistd.h>
  20.  
  21. /* Faking of the time() system call via procfs.
  22.  *
  23.  * Daniel Brown, dbrown@ccdc.cam.ac.uk
  24.  *
  25.  * Compiled and tested under Solaris 2.6/sparc and 2.6/x86
  26.  */
  27.  
  28. int
  29. read_status(pid_t pid, pstatus_t *status)
  30. {
  31.   char buf[MAXPATHLEN];
  32.   int fd;
  33.  
  34.   sprintf(buf, "/proc/%d/status", (int) pid);
  35.  
  36.   if ((fd = open(buf, O_RDONLY)) == -1)
  37.     {
  38.       perror("read_status(open)");
  39.       return 1;
  40.     }
  41.  
  42.   if (read(fd, (void *) status, sizeof(pstatus_t)) != sizeof(pstatus_t))
  43.     {
  44.       perror("read_status(read)");
  45.       return 1;
  46.     }
  47.   close(fd);
  48.  
  49.   return 0;
  50. }
  51.  
  52. int
  53. write_ctl(pid_t pid, long syscall, void *arg, size_t arglen)
  54. {
  55.   int fd;
  56.   char buf[MAXPATHLEN];
  57.   struct iovec vec[2];
  58.  
  59.   sprintf(buf, "/proc/%d/ctl", (int) pid);
  60.  
  61.   if ((fd = open(buf, O_WRONLY)) == -1)
  62.     {
  63.       perror("write_ctl(open)");
  64.       return 1;
  65.     }
  66.  
  67.   vec[0].iov_base = (void *) &syscall;
  68.   vec[0].iov_len = sizeof(long);
  69.  
  70.   if (arg != NULL)
  71.     {
  72.       vec[1].iov_base = arg;
  73.       vec[1].iov_len = arglen;
  74.  
  75.       if (writev(fd, vec, 2) != (vec[0].iov_len + vec[1].iov_len))
  76.         {
  77.           perror("write_ctl(write2)");
  78.           close(fd);
  79.           return 1;
  80.         }
  81.     }
  82.   else
  83.     {
  84.       if (writev(fd, vec, 1) != vec[0].iov_len)
  85.         {
  86.           perror("write_ctl(write1)");
  87.           return 1;
  88.         }
  89.     }
  90.  
  91.   close(fd);
  92.  
  93.   return 0;
  94. }
  95.  
  96. int
  97. main(int argc, char **argv)
  98. {
  99.   pid_t pid, ppid;
  100.   pstatus_t pstatus;
  101.   sysset_t sysset;
  102.   long val;
  103.  
  104.   setvbuf(stdout, (char *) NULL, _IONBF, (size_t) 0);
  105.  
  106.   ppid = getpid();
  107.  
  108.   if (read_status(ppid, &pstatus))
  109.     exit(1);
  110.  
  111.   printf("Parent PID is %d\n", (int) ppid);
  112.  
  113.   printf("Setting PCSEXIT for time() : stop on exit from time().\n");
  114.  
  115.   premptyset(&sysset);
  116.   praddset(&sysset, SYS_time);
  117.  
  118.   if (write_ctl(ppid, PCSEXIT, (void *) &sysset, sizeof(sysset_t)))
  119.     exit(1);
  120.  
  121.   printf("Setting PR_FORK, so that the child inherits these traps.\n");
  122.  
  123.   val = PR_FORK;
  124.  
  125.   if (write_ctl(ppid, PCSET, (void *) &val, sizeof(long)))
  126.     exit(1);
  127.  
  128.   printf("Finally, setting PCSENTRY for exit() "
  129.          ": stop on entry to exit().\n");
  130.  
  131.   premptyset(&sysset);
  132.   praddset(&sysset, SYS_exit);
  133.  
  134.   if (write_ctl(ppid, PCSENTRY, (void *) &sysset, sizeof(sysset_t)))
  135.     exit(1);
  136.  
  137.   if ((pid = fork()) < 0)
  138.     {
  139.       perror("fork");
  140.       exit(1);
  141.     }
  142.   else if (pid > 0)
  143.     { /* Parent */
  144.  
  145.       printf("Clearing exit() trap for the parent...\n");
  146.  
  147.       premptyset(&sysset);
  148.       if (write_ctl(ppid, PCSENTRY, (void *) &sysset,
  149.                     sizeof(sysset_t)))
  150.         exit(1);        /* Good luck! */
  151.  
  152.       if (read_status(pid, &pstatus))
  153.         exit(1);
  154.  
  155.       printf("Child PID is %d and %s have a trap set on time().\n",
  156.              (int) pstatus.pr_pid,
  157.              (prismember(&pstatus.pr_sysexit,
  158.                          SYS_time)) ? "does" : "doesn't");
  159.  
  160.       while (1)
  161.         {
  162.  
  163.           printf("Waiting for child to call time() or exit().\n");
  164.  
  165.           if (write_ctl(pid, PCWSTOP, (void *) 0, 0))
  166.             exit(1);
  167.  
  168.           printf("Write PCWSTOP returned. Reading status.\n");
  169.  
  170.           if (read_status(pid, &pstatus))
  171.             exit(1);
  172.  
  173.           if (pstatus.pr_lwp.pr_syscall == SYS_exit)
  174.             {
  175.               printf("Child has called exit(). Bye!\n");
  176.               exit(0);
  177.             }
  178.           else if (pstatus.pr_lwp.pr_syscall != SYS_time)
  179.             {
  180.               printf("We've caught syscall %d! Eeeek!\n",
  181.                      (int) pstatus.pr_lwp.pr_syscall);
  182.               exit(1);
  183.             }
  184.  
  185.           printf("Child has called time().\n");
  186.  
  187.           printf("LWP register R_R0 is %d.\n",
  188.                  (int) pstatus.pr_lwp.pr_reg[R_R0]);
  189.  
  190.           printf("Setting LWP register R_R0 to 123.\n");
  191.  
  192.           pstatus.pr_lwp.pr_reg[R_R0] = 123;
  193.           if (write_ctl(pid, PCSREG, (void *) &pstatus.pr_lwp.pr_reg,
  194.                         sizeof(prgregset_t)))
  195.             exit(1);
  196.  
  197.           printf("Restarting the child.\n");
  198.  
  199.           val = 0L;
  200.  
  201.           if (write_ctl(pid, PCRUN, (void *) &val, sizeof(long)))
  202.             exit(1);
  203.  
  204.           printf("Restarted.\n");
  205.  
  206.         }       /* while (1) */
  207.  
  208.       /* NOT REACHED */
  209.     }
  210.  
  211.   /* Child */
  212.  
  213.   sleep(5);
  214.  
  215.   execl("/usr/bin/date", "/usr/bin/date", (char *) NULL);
  216.  
  217.   perror("execl failed");
  218.  
  219.   return 99;
  220. }
  221. /*                    www.hack.co.za              [2000]*/